<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    
    function Person (name, age) {
      // 构造函数里的this指的是将来new的那个实例
      // this是将来的实例，给实例新增一个name属性，属性值为参数name
      this.name = name
      this.age = age
      // 给对象新增方法
      this.say = function () {
        console.log(`My name is ${this.name}`)
      }
    }
    // 当我们通过new运算符来构造函数的时候到底发生了什么（第一步和第三步咱们是看不见的）
    // 1、构造函数里会创建一个空对象，然后把this指向这个对象
    // 2、执行构造函数里的代码，给this对象新增属性
    // 3、会把这个对象return出来
    var xm = new Person('xiaoming', 18)
    console.log(xm)
    xm.say()

    var xh = new Person('xiaohong', 20)
    console.log(xh)
    xh.say()

    // 虽然say方法体是一样的，但是每一个实例里有一个自己的say，地址是不一样的
    console.log(xm.say === xh.say) // false





  </script>
</body>
</html>